package starkuz.lg.tools;

import starkuz.lg.dto.FormFieldsDto;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;

import javax.servlet.ServletContext;
import java.io.*;

public class ZipBuilder {

    public static void buildZip(ServletContext context, FormFieldsDto formFieldsDto, Integer templId)
            throws ZipException, IOException {
        //получаем полный путь к папке builder
        String realContextPathBuilder = context.getRealPath("builder");

        ZipFile zipFile = new ZipFile(realContextPathBuilder + "/site.zip");

        //генерируем из полученных в формах данных index.html
        File htmlFile = HtmlFileMaker.getHtmlFile(formFieldsDto, realContextPathBuilder, templId);
        //помещаем index.html в корень архива site.zip
        zipFile.addFile(htmlFile, new ZipParameters());

        //получаем абсолютный путь на сервере к папке static
        String realContextPathStatic = context.getRealPath("static");

        //Получаем ссылку на папку с файлами к шаблону XXXX
        File templateFolder = new File(realContextPathStatic + "/templates/templ" + formFieldsDto.getIdTemplate());

        //добавляем папку с файлами внутрь архива к шаблону XXXX
        ZipParameters addparams = new ZipParameters();
        addparams.setRootFolderInZip("static/templates");
        zipFile.addFolder(templateFolder, addparams);
    }

    //метод для очистки архива для дальнейшего использования (чтобы не скапливались шаблоны)
    public static void cleanZip(ServletContext context) throws ZipException {
        //получаем полный путь к папке builder
        String realContextPathBuilder = context.getRealPath("builder");
        File workFile = new File(realContextPathBuilder + "/site.zip");
        File cleanFile = new File(realContextPathBuilder + "/empty_site.zip");
        FileInputStream fi = null;
        FileOutputStream fo = null;

        try {
            fi = new FileInputStream(cleanFile);
            fo = new FileOutputStream(workFile);
            int nLength;
            byte[] buf = new byte[8000];
            while (true) {
                nLength = fi.read(buf);
                if (nLength < 0) {
                    break;
                }
                fo.write(buf, 0, nLength);
            }
        } catch (IOException ex) {

        } finally {
            if (fi != null) {
                try {
                    fi.close();
                } catch (Exception ex) {
                }
            }
            if (fo != null) {
                try {
                    fo.close();
                } catch (Exception ex) {
                }
            }
        }
    }
}
